钩子方法 hook method(回调函数 callback)
我们在编程时,会发现有很多方法。
有几种方法,是比较特殊的方法。 它们存在的意义,往往跟过程相关。
实现模式 implementation pattern
找女人约会, 要记得买花, 这是模式 跟男朋友约会, 要记得打扮,也是妹子的模式。 陌生人头一次见面,要握手,这是模式。 就算不认识对方,但是也要给对方留余地, 往往会说: 久仰! 幸会!
我们在编程的时候, 也要用到模式。 例如:
一个person, 能出生, 就一定会死亡。
class Person
def born
end
def dead
end
end
再比如:
class Money
def get
end
def spend
end
end
上面的方法, 是有对应的关系的,这个对应关系, 就是一种模式。
所以,好的代码,看起来应该是:
class MyModel
def before_save
end
def save
end
def after_save
end
end
我们接下来看这个代码:
public class MysqlDemo {
public static void main(String[] args) throws Exception {
// 这里就是 before_execute();
Connection conn = null;
String sql;
String url = "jdbc:mysql://localhost:3306/javademo?"
+ "user=root&password=root&useUnicode=true&characterEncoding=UTF8";
Class.forName("com.mysql.jdbc.Driver");// 动态加载mysql驱动
System.out.println("成功加载MySQL驱动程序");
// 一个Connection代表一个数据库连接
conn = DriverManager.getConnection(url);
// Statement里面带有很多方法,比如executeUpdate可以实现插入,更新和删除等
Statement stmt = conn.createStatement();
// 这里就是 execute()
sql = "create table student(NO char(20),name varchar(20),primary key(NO))";
int result = stmt.executeUpdate(sql);// executeUpdate语句会返回一个受影响的行数,如果返回-1就没有成功
if (result != -1) {
System.out.println("创建数据表成功");
sql = "insert into student(NO,name) values('2012001','陶伟基')";
result = stmt.executeUpdate(sql);
sql = "insert into student(NO,name) values('2012002','周小俊')";
result = stmt.executeUpdate(sql);
sql = "select * from student";
ResultSet rs = stmt.executeQuery(sql);// executeQuery会返回结果的集合,否则返回空值
System.out.println("学号\t姓名");
while (rs.next()) {
System.out
.println(rs.getString(1) + "\t" + rs.getString(2));// 入如果返回的是int类型可以用getInt()
}
}
// after_execute();
conn.close();
}
}
所以,上面的代码就是三部分组成:
before_execute, execute after_execute
一旦写的代码多了,会发现,如果这个方法,(execute) 看成是一个东西的话,我们一把它从脑海里,拎出来,就会发现, 会出来三个: before, execute, after.. 就好像 有钩子,勾在 execute这个核心方法上一样。
所以,我们管, before_execute, after_execute, 这样的方法,叫做: 钩子方法 (hook method)
我们写代码,写了 before, 就一定要写after. 哪怕,after中,是空代码,也要写出来。
回调函数。 callbacks.
我们要发起一个上传图片的http请求。 那么,这个请求,会有3种不同的后果:
- success.
- error
- processing.
所以,我们往往会这样写:(使用了最常见的javascript代码)
$.ajax({
url: '../wp-content/themes/bsj/php/validate.php',
type: 'post',
a: 1,
success: function(){
alert('success!');
},
error: function(){
alert('error!');
},
processing: function(){
alert('处理当中。。。') // 这里用于: 显示上传进度。
}
});
事件(events) 和 通知。
场景:
$('form').submit()
$('button').click(function(){
alert('hi!')
})
rails中的 hooks method.
controller中:
def edit
@article = Article.find params[:id]
end
def update
@article = Article.find params[:id]
redirect_to articles_path
end
def destroy
@article = Article.find params[:id]
@article.destroy
redirect_to articles_path
end
上面3行代码,都是一样的:
@article = Article.find params[:id]
所以, rails 提供了 hook method: before_filter
class XXAction
before_action :get_article, :only => [:edit, :update, :destroy]
def edit
end
def update
redirect_to articles_path
end
def destroy
@article.destroy
redirect_to articles_path
end
private
def get_article
@article = Article.find params[:id]
end
end
ActiveRecord 中的 hooks.
class Count < ActiveRecord::Base
before_save :say_hi
# 这个方法是隐形的。 定义于: ActiveRecord::Base 中。
def save
end
def say_hi
puts "=== hihihi"
end
end